#ifndef __BLLDEVICE_H__
#define __BLLDEVICE_H__

#include <iostream>
#include <memory>
#include <thread>
#include <mutex>
#include <string>
#include <chrono>

#include "logger_plus_test_lib.h"
#include "serialport.h"

/**
 * @brief BLL SLD光源通信控制类
 *
 */
class BLLDevice {
public:
    /**
     * @brief Construct a new BLLDevice object
     *
     * @param portName 连接的串口
     * @param switchCtrl 光源内部开关控制(1使能),
       bit0:CH1 en, bit4:InteralLock, bit5:remoteIO, bit6: modulation, bit7: powerMonitor,
       一些设备不支持的功能使能后可能导致初始化一直失败
     */
    BLLDevice(const char* portName, const char switchCtrl = 1);
    ~BLLDevice();

    /**
     * @brief 获取设备信息
     *
     * @return const char* 设备信息
     */
    const char* getDevInfo();

    /**
     * @brief 查询设备是不有错误
     *
     * @return true 有错误
     * @return false 无错误
     */
    bool isHasError();

    /**
     * @brief 查询设备是否已经初始化完成
     *
     * @return true 初始化完成
     * @return false 初始化未完成
     */
    bool isInitialized();

    bool isStopped();

    bool isStarted();

    /**
     * @brief 设备的光学模块温度是否已经稳定
     *
     * @return true
     * @return false
     */
    bool isTemperatureStabilized();

    /**
     * @brief 获取通道1状态
     *
     * @return int 非0~0x0FF为异常状态(通信失败或未初始化), 状态解释如下：
     * bit0: 1:光学模块使能 0:光学模块禁止
     * bit1: 1:TEC打开 0:TEC关闭 (TEC大概是热敏或加热电阻的意思)
     * bit2: 0:光学模块温度稳定 1:未稳定
     * bit3: 1:TEC热敏电阻错误
     * bit4: 1:SLD工作在恒电流模式 0:SLD工作在恒功率模式
     * bit5: 1:SLD开启 0:SLD关闭
     * bit6: 1:SLD电流限制超限
     * bit7: 1:SLD错误
     */
    int getCH1Status();

    /**
     * @brief 获取设备当前工作温度
     *
     * @return int 工作温度, -127 ~ 127摄氏度为正常值, 其它值为异常(通信或初始化失败)
     */
    int getTemperture();

    /**
     * @brief 获取设备当前工作功率(有些设备的型号不支持会一直返回零)
     *
     * @return int 工作功率, 0 ~ 4095mW为正常值, 其它为异常值(通信或初始化失败)
     */
    int getPower();

    /**
     * @brief 设置设备的光学模块电流, 从而设置光源出光强度
     *
     * @param rate 电流比率, 0~50, 1.0f对应100%出厂强度
     */
    void setCurrent(float rate);

    /**
     * @brief 停止光源
     *
     */
    void stop();

    /**
     * @brief 启动光源
     *
     */
    void start();

private:
    /**
     * @brief 扫描设备通信线程主体函数
     *
     */
    void threadLoop();

    int m_switchCtrl;
    bool m_isQuit;
    bool m_isInit;
    int m_fmoduleCurrent;
    int m_ch1Status;
    int m_temperature;
    int m_power;
    std::mutex m_mutex;
    std::shared_ptr<std::string> m_portName;
    std::shared_ptr<std::thread> m_thread;
    std::shared_ptr<char> m_devinfo;
    int m_errcnt;

    bool cmd_stop;
    float cmd_moduleCurrent;
    bool cmd_start;

}; // class BLLDevice

#endif // __BLLDEVICE_H__